home *** CD-ROM | disk | FTP | other *** search
/ Macwelt 1 / Macwelt DVD 1.toast / Software für Mac-OS X / Entwickler-Tools / netbeans / modules / ext / djava.jar / koala / dynamicjava / util / ReflectionUtilities.class (.txt) < prev   
Encoding:
Java Class File  |  2000-03-14  |  5.5 KB  |  257 lines

  1. package koala.dynamicjava.util;
  2.  
  3. import java.lang.reflect.Constructor;
  4. import java.lang.reflect.Field;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.Modifier;
  7. import java.util.Iterator;
  8. import java.util.LinkedList;
  9. import java.util.List;
  10.  
  11. public class ReflectionUtilities {
  12.    // $FF: synthetic field
  13.    private static Class class$Ljava$lang$Object;
  14.  
  15.    public static Constructor lookupConstructor(Class var0, Class[] var1) throws NoSuchMethodException {
  16.       List var2 = getConstructors(var0, var1.length);
  17.       LinkedList var3 = new LinkedList();
  18.  
  19.       for(Constructor var5 : var2) {
  20.          if (hasCompatibleSignatures(var5.getParameterTypes(), var1)) {
  21.             var3.add(var5);
  22.          }
  23.       }
  24.  
  25.       if (var3.isEmpty()) {
  26.          throw new NoSuchMethodException(var0.getName() + " constructor");
  27.       } else {
  28.          Iterator var6 = var3.iterator();
  29.  
  30.          Constructor var7;
  31.          for(var7 = (Constructor)var6.next(); var6.hasNext(); var7 = selectTheMostSpecificConstructor(var7, (Constructor)var6.next())) {
  32.          }
  33.  
  34.          return var7;
  35.       }
  36.    }
  37.  
  38.    public static List getConstructors(Class var0, int var1) {
  39.       LinkedList var2 = new LinkedList();
  40.       Constructor[] var3 = var0.getDeclaredConstructors();
  41.  
  42.       for(int var4 = 0; var4 < var3.length; ++var4) {
  43.          if (var3[var4].getParameterTypes().length == var1) {
  44.             var2.add(var3[var4]);
  45.          }
  46.       }
  47.  
  48.       return var2;
  49.    }
  50.  
  51.    public static Method lookupMethod(Class var0, String var1, List var2) throws NoSuchMethodException {
  52.       return lookupMethod(var0, var1, (Class[])var2.toArray());
  53.    }
  54.  
  55.    public static Method lookupMethod(Class var0, String var1, Class[] var2) throws NoSuchMethodException {
  56.       List var3 = getMethods(var0, var1, var2.length);
  57.       LinkedList var4 = new LinkedList();
  58.  
  59.       for(Method var6 : var3) {
  60.          if (hasCompatibleSignatures(var6.getParameterTypes(), var2)) {
  61.             var4.add(var6);
  62.          }
  63.       }
  64.  
  65.       if (var4.isEmpty()) {
  66.          throw new NoSuchMethodException(var1);
  67.       } else {
  68.          Iterator var7 = var4.iterator();
  69.  
  70.          Method var8;
  71.          for(var8 = (Method)var7.next(); var7.hasNext(); var8 = selectTheMostSpecificMethod(var8, (Method)var7.next())) {
  72.          }
  73.  
  74.          return var8;
  75.       }
  76.    }
  77.  
  78.    public static List getMethods(Class var0, String var1, int var2) {
  79.       LinkedList var3 = new LinkedList();
  80.       if (var0.isInterface()) {
  81.          Method[] var4 = var0.getDeclaredMethods();
  82.  
  83.          for(int var5 = 0; var5 < var4.length; ++var5) {
  84.             if (var4[var5].getName().equals(var1) && var4[var5].getParameterTypes().length == var2) {
  85.                var3.add(var4[var5]);
  86.             }
  87.          }
  88.  
  89.          Class[] var8 = var0.getInterfaces();
  90.  
  91.          for(int var6 = 0; var6 < var8.length; ++var6) {
  92.             var3.addAll(getMethods(var8[var6], var1, var2));
  93.          }
  94.  
  95.          if (var8.length == 0) {
  96.             var3.addAll(getMethods(class$Ljava$lang$Object != null ? class$Ljava$lang$Object : (class$Ljava$lang$Object = class$("java.lang.Object")), var1, var2));
  97.          }
  98.       } else {
  99.          for(Class var7 = var0; var7 != null; var7 = var7.getSuperclass()) {
  100.             Method[] var9 = var7.getDeclaredMethods();
  101.  
  102.             for(int var10 = 0; var10 < var9.length; ++var10) {
  103.                if (var9[var10].getName().equals(var1) && var9[var10].getParameterTypes().length == var2) {
  104.                   var3.add(var9[var10]);
  105.                }
  106.             }
  107.          }
  108.       }
  109.  
  110.       return var3;
  111.    }
  112.  
  113.    public static Method lookupOuterMethod(Class var0, String var1, Class[] var2) throws NoSuchMethodException {
  114.       boolean var3 = Modifier.isStatic(var0.getModifiers());
  115.  
  116.       for(Class var4 = var0 != null ? var0.getDeclaringClass() : null; var4 != null; var4 = var4.getDeclaringClass()) {
  117.          var3 |= Modifier.isStatic(var4.getModifiers());
  118.  
  119.          try {
  120.             Method var5 = lookupMethod(var4, var1, var2);
  121.             if (!var3 || Modifier.isStatic(var5.getModifiers())) {
  122.                return var5;
  123.             }
  124.          } catch (NoSuchMethodException var6) {
  125.          }
  126.       }
  127.  
  128.       throw new NoSuchMethodException(var1);
  129.    }
  130.  
  131.    public static Field getField(Class var0, String var1) throws NoSuchFieldException, AmbiguousFieldException {
  132.       for(Class var2 = var0; var2 != null; var2 = var2.getSuperclass()) {
  133.          try {
  134.             return var2.getDeclaredField(var1);
  135.          } catch (NoSuchFieldException var10) {
  136.             Class[] var4 = var2.getInterfaces();
  137.             Field var5 = null;
  138.  
  139.             for(int var6 = 0; var6 < var4.length; ++var6) {
  140.                Field var7 = null;
  141.  
  142.                try {
  143.                   var7 = getField(var4[var6], var1);
  144.                } catch (NoSuchFieldException var9) {
  145.                }
  146.  
  147.                if (var7 != null) {
  148.                   if (var5 != null && !var5.equals(var7)) {
  149.                      throw new AmbiguousFieldException(var1);
  150.                   }
  151.  
  152.                   var5 = var7;
  153.                }
  154.             }
  155.  
  156.             if (var5 != null) {
  157.                return var5;
  158.             }
  159.          }
  160.       }
  161.  
  162.       throw new NoSuchFieldException(var1);
  163.    }
  164.  
  165.    public static Field getOuterField(Class var0, String var1) throws NoSuchFieldException, AmbiguousFieldException {
  166.       boolean var2 = Modifier.isStatic(var0.getModifiers());
  167.  
  168.       for(Class var3 = var0 != null ? var0.getDeclaringClass() : null; var3 != null; var3 = var3.getDeclaringClass()) {
  169.          var2 |= Modifier.isStatic(var3.getModifiers());
  170.  
  171.          try {
  172.             Field var4 = getField(var3, var1);
  173.             if (!var2 || Modifier.isStatic(var4.getModifiers())) {
  174.                return var4;
  175.             }
  176.          } catch (NoSuchFieldException var5) {
  177.          }
  178.       }
  179.  
  180.       throw new NoSuchFieldException(var1);
  181.    }
  182.  
  183.    protected static Method selectTheMostSpecificMethod(Method var0, Method var1) {
  184.       Class[] var2 = var0.getParameterTypes();
  185.       Class[] var3 = var1.getParameterTypes();
  186.  
  187.       for(int var4 = 0; var4 < var2.length; ++var4) {
  188.          if (var2[var4] != var3[var4]) {
  189.             return isCompatible(var2[var4], var3[var4]) ? var1 : var0;
  190.          }
  191.       }
  192.  
  193.       return var0;
  194.    }
  195.  
  196.    protected static Constructor selectTheMostSpecificConstructor(Constructor var0, Constructor var1) {
  197.       Class[] var2 = var0.getParameterTypes();
  198.       Class[] var3 = var1.getParameterTypes();
  199.  
  200.       for(int var4 = 0; var4 < var2.length; ++var4) {
  201.          if (var2[var4] != var3[var4]) {
  202.             if (isCompatible(var2[var4], var3[var4])) {
  203.                return var1;
  204.             }
  205.  
  206.             return var0;
  207.          }
  208.       }
  209.  
  210.       return var0;
  211.    }
  212.  
  213.    public static boolean hasCompatibleSignatures(Class[] var0, Class[] var1) {
  214.       for(int var2 = 0; var2 < var0.length; ++var2) {
  215.          if (!isCompatible(var0[var2], var1[var2])) {
  216.             return false;
  217.          }
  218.       }
  219.  
  220.       return true;
  221.    }
  222.  
  223.    public static boolean isCompatible(Class var0, Class var1) {
  224.       if (var0.isPrimitive()) {
  225.          if (var0 == var1) {
  226.             return true;
  227.          } else if (var0 == Integer.TYPE) {
  228.             return var1 == Byte.TYPE || var1 == Short.TYPE || var1 == Character.TYPE;
  229.          } else if (var0 == Long.TYPE) {
  230.             return var1 == Byte.TYPE || var1 == Short.TYPE || var1 == Integer.TYPE;
  231.          } else if (var0 == Short.TYPE) {
  232.             return var1 == Byte.TYPE;
  233.          } else if (var0 == Float.TYPE) {
  234.             return var1 == Byte.TYPE || var1 == Short.TYPE || var1 == Integer.TYPE || var1 == Long.TYPE;
  235.          } else if (var0 != Double.TYPE) {
  236.             return false;
  237.          } else {
  238.             return var1 == Byte.TYPE || var1 == Short.TYPE || var1 == Integer.TYPE || var1 == Long.TYPE || var1 == Float.TYPE;
  239.          }
  240.       } else {
  241.          return var1 == null ? true : var0.isAssignableFrom(var1);
  242.       }
  243.    }
  244.  
  245.    // $FF: synthetic method
  246.    static Class class$(String var0) {
  247.       try {
  248.          return Class.forName(var0);
  249.       } catch (ClassNotFoundException var2) {
  250.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  251.       }
  252.    }
  253.  
  254.    protected ReflectionUtilities() {
  255.    }
  256. }
  257.